The SCake SDK is a quick and easy way to set up integrations with Project Sugar Cake for making modules and accessing the API.


--- --- --- --- ---
(_) How To Install (_)

Simply copy the "Mods" folder into the "Content" folder of your devkit / UE5 environment while the project is closed, then load up your usual project. (The assets are uncooked, so they import directly and can be accessed easily)


--- --- --- --- ---
(_) Usage Instructions (_)

The SDK provides 'dummy' files/assets you point your mod to, then when you export your mod and load it in-game with Project Sugar Cake also installed, the mod will access the SCake API and trigger the appropriate functions/effects. DO NOT include the SDK files with your mod, this will break SCake and the API, I've set up an asset label that should keep it separated, but double check the ChunkID to make sure it doesn't conflict with your mod if you use the packaging method!

When importing the SDK, do not change the file path/structure for the AC_AnimFramework folder! The file path must match exactly in order for the API to work properly (also don't change any sub-folders at all). Technically, if you don't wish to 'install' the API or have issues with the provided one, you can still create a "dummy actor" in the appropriate folder and re-create the functions/events seen in the SDK to still access the functions properly (Check definitions below for names and variables). Similarly, if there are API functions you're not using you can remove them from your instance of the SDK if you ever find a reason to do so. (This can be useful if an update broke a certain function and the SDK hasn't been updated to fix it yet)


--- --- --- --- ---
			!!!   !!!
(_) Arb Variables and Saving Notes (_)

For memory and file saving weight concerns, stats added at run-time will not persist within the save by default. This is the prefered behavior, however if you have a stat that absolutely MUST persist between saves you can enable the "persist" boolean when registering a stat. However, you need to be extremely careful! If a user disables or uninstalls a module that added an Arb Variable (like ArbString) with persistence checked it will stay in that pal's data and in the save file until it is forcibly removed! To save memory, arb variables that are 0 or none/null are skipped while saving if they are set to only decay (or have no decay) / are a string. This means you can effectively remove an ArbVariable by setting its value to 0/none and it will be removed automatically even if persist is enabled. If, however, you set up a variable with no decay (or set an ArbString with persist) it will remain in memory with no way to clear itself automatically. Try not to cause save bloat with your module and be sparing with what you add, and if you can, do it without persist enabled!


--- --- --- --- ---
(_) SCake's Structure (_)

While this section isn't required to read, knowing a bit how SCake works internally could help you understand how to effectively pull data and get the references you need. SCake exists as a single Actor within the game-world that is always active, then different modules 'attach' to the main actor as components to then run their own code before they destroy themselves when no longer required. Various data storing style aspects such as Animation Events are stored as custom Objects, these objects can be accessed for their own variables and functions.

The Main "AC_AnimFramework" Actor is used to run all of the API and will have fallback features between different ACake versions, this is the actor you'll be interfacing with for the API functions.

Animations play inside an "ACake_AnimEventPlayer" component which stores all the data related to playback and processes the actual animation. If you need information related to an animation that's currently running you'll use the API to get the AnimEventPlayer reference and pull data from it.

Tracking is done through "SCake_CharStatus" components, these store the current SCake status of individual characters. If you need to check SCake Status variables or modify them you'll use the API to get the CharStatus and modify them using this component.


--- --- --- --- ---
~!~ API Explanation ~!~

API NOTE :
	There are 2 different API pre-fixes, ACake (Angel Cake) is the SFW and Neutral functions which are used for both SFW and R18+ purposes, SCake (Sugar Cake) is explicitly used for R18+ purposes and are only available when the SugarCakeExtension is installed. (If you're making a SFW module, only use ACake calls! While SCake calls 'may' have a fallback, this is not guaranteed and could cause crashes if called without the SugarCake extension)

	ACake = Safe
	SCake = R18+

ACake_AnimFramework
	The main Assorted Cakes Animation Framework Actor, this actor acts as the main entry point for the API and functions, use "Get Actor of Class" in BPs with a short delay beforehand to grab this actor reliably

	Variables

		ModVersion [Integer]
			Version number for the currently installed AC_AnimFramework (Done manually so may not always be 100% accurate do-to human error)

		SugarCake [SugarCake]
			Reference to the SugarCakeExtension component, only valid if Sugar Cake or Pound Cake is installed/enabled (Can check if this is valid to see if the user has SugarCake/PoundCake installed)

		SugarCakeActive [Boolean]
			Whether SugarCake is installed and active (Pals enabled for erotic content)
		
		PoundCake [Boolean]
			Whether PoundCake is installed and active (Only Humans/NPCs available for erotic content)

	Events

		ACake_SendNotif
			Sends a notification through ACake to UniPalUI
				Message [Text]
					Message to display

		ACake_SendReportMessage
			Sends a notification to ACake_SendNotif and to the UE4SS console (Useful for debugging and error messages)
				Message [String]
					Message to display
					
		ACake_StopAnimEvent
			Attempts to stop the specificed Animation Event by reference
				AnimEventPlayer [ACake_AnimEventPlayer]
					Specific AnimEvent to stop

		ACake_StopAnimEventFromChar
			Attepts to stop any animation event the specified character is involved in
				CharReference [Pal Character]
					Character to scan events for and stop

		ACake_RegisterAllJSON
			(Note : This function runs automatically when the mod loads up so you do not need to call this unless you alter the _LoadList afterward.)
			Registers all .json files in the _LoadList, call after modifying the loadlist directly

	Functions

		ACake_FindPotentialAnimEvents
			Returns an array of compatible AnimEvents based on the parameters given
				CharList [PalCharacter Array]
					Characters to include in the animation
				FindMaxCount [Integer]
					How many animations to find before returning results, if value is higher than 0 then random Events will be returned until the max number is reached (0 will return all possible events, if you just need a random EventID to playback and don't need to do filtering or caching, you can set this value to 1 to get a random compatible Animation Event)
				IsInteraction [Boolean]
					Whether to find Interact AnimEvents or not
				IncludeTags [Name Set]
					Tags to search for when finding animations
				RequireAllTags [Boolean]
					Whether all tags are required for an animation to be considered, if false then only a single tags is required
				ExcludeTags [Name Set]
					Tags that invalidate animations from being considered, excluding them from results
				ObjectTarget [Actor]
					Target for "furniture" or "object" target animations (Will only consider animations with this target set as compatible)
				Returns : AnimEvents [SCake_AnimEventObj Array]
					Possible AnimEvents found that are compatible with the given parameters

		ACake_GetAnimEventByID
			Gets an AnimEvent by its UniqueID, could use to check if an event is registered or grab a specific event for playback (Does not return Erotic animation events, use SCake_GetAnimEventByID for Erotic animations)
				UniqueID [Name]
					The UniqueID of the AnimEvent you'd like to get
				Returns : Valid [Boolean]
					Whether the AnimEvent was found or not
				Returns : AnimEvent [ACake_AnimEventObj]
					The AnimEvent object with the associated UniqueID

		ACake_GetAnimSlotByID
			Gets an AnimSlot by its UniqueID, could use to check if an event is registered or grab specific parameters (Does not return Erotic animation events, use SCake_GetAnimSlotByID for Erotic animations)
				UniqueID [Name]
					The UniqueID of the AnimSlot you'd like to get
				Returns : Valid [Boolean]
					Whether the AnimSlot was found or not
				Returns : AnimSlot [ACake_AnimSlotObj]
					The AnimSlot object with the associated UniqueID

		ACake_GetCharAnim
			Checks if the given character is in an animation and if so returns the AnimEventPlayer
				CharReference [PalCharacter]
					Character to search for
				Returns : InAnimation [Boolean]
					Whether the character was found in the playing Animation Event List
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]
					If InAnimation was true, returns the AnimEventPlayer

		ACake_SetEventEnabledState
			Sets whether the given AnimEvent should be enabled or disabled (Disabled just disallows it from showing up in randomization and swap menus, does not prevent forced playback)
				AnimEvent [ACake_AnimEventObj]
					The AnimEvent to Enable/Disable
				Enabled [Boolean]
					Whether the AnimEvent should be Enabled (True) or Disabled (False)

		ACake_StartAnimEvent
			Starts an animation using Angel Cake with potentially more information, allowing better control (If you need an Erotic animation then start the event through SugarCake instead using SCake_StartAnimEvent functions)
				CharList [PalCharacter Array]
					List of characters to include in the animation (Internally this can be any PalCharacter Reference)
				AnimEvent [ACake_AnimEventObj]
					[Optional] Animation Event to play, if none is supplied a random compatible animation will be selected to play
				TargetDuration [Float]
					[Optional] Forced max duration which applies to looping animations, when at 0.0 or below this will be ignored. (Use to create very specific animations for scenes or interactions)
				IsInteraction [Boolean]
					Uses the Interact Player instead of the Loop Player, does not progress without input from external scripts.
				IncludedTags [Name Set]
					[Optional] Tags to search for when finding animations to play (Only applies if no AnimEvent is provided)
				RequireAllTags [Boolean]
					[Optional] Whether all tags are required for an animation to be considered, if false then only a single tags is required
				ExcludeTags [Name Set]
					[Optional] Tags that invalidate animations from being considered, excluding them from results
				ObjectTarget [Actor]
					[Optional] Target for "furniture" or "object" target animations (Will only play animations with the given object target set as compatible)
				AnimRoot [Transform]
					[Optional] Location where the animation should play (Can use a character's mesh world transform if desired)
				Returns : Valid [Boolean]
					Returns if the animation had valid input and began playing
				Returns : ErrorOutput [String]
					Returns an output message with any errors
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]
					If Valid is true, the AnimEventComp the animation started

		ACake_StartAnimEvent_Basic
			Starts an animation using Angel Cake with minimal information. (If you need an Erotic animation then start the event through SugarCake instead using SCake_StartAnimEvent functions)
				CharList [PalCharacter Array]
					List of characters to include in the animation (Internally this can be any PalCharacter Reference)
				AnimEvent [ACake_AnimEventObj]
					[Optional] Animation Event to play, if none is supplied a random compatible animation will be selected to play
				IsInteraction [Boolean]
					Uses the Interact Player instead of the Loop Player, does not progress without input from external scripts.
				ObjectTarget [Actor]
					[Optional] Target for "furniture" or "object" target animations (Will only play animations with the given object target set as compatible)
				Returns : Valid [Boolean]
					Returns if the animation had valid input and began playing
				Returns : ErrorOutput [String]
					Returns an output message with any errors
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]
					If Valid is true, the AnimEventComp the animation started

		ACake_TraceForChar
			Uses a line-trace to search for characters from the player's camera (center of screen), useful to target and apply code to characters the player is looking at.
				Distance [Integer]
					Distance from the camera to check in UE units
				Returns : Valid [Boolean]
					Whether the trace found a valid pal
				Returns : CharFound [PalCharacter]
					PalCharacter Reference the trace found

		ACake_ValidForAnim
			Returns if the character is valid to start an animation or not without scanning for animations to play or starting an animation event (NOTE : Validity is already checked when calling for an animation to start so you only need to run this if you need the return value before starting an animation event)
				CharReference [PalCharacter]
					Character to check if valid to start animations
				Returns : Valid [Boolean]
					If true, the character is available to start an animation with
				Returns : ErrorOutput [String]
					If not valid then this returns the raw error output

		SCake_FindPotentialAnimEvents
			Returns an array of compatible AnimEvents based on the parameters given
				CharList [PalCharacter Array]
					Characters to include in the animation
				FindMaxCount [Integer]
					How many animations to find before returning results, if value is higher than 0 then random Events will be returned until the max number is reached (0 will return all possible events, if you just need a random EventID to playback and don't need to do filtering or caching, you can set this value to 1 to get a random compatible Animation Event)
				IsErotic [Boolean]
					Whether results should be Erotic or not
				IsInteraction [Boolean]
					Whether to find Interact AnimEvents or not
				IncludeTags [Name Set]
					Tags to search for when finding animations
				RequireAllTags [Boolean]
					Whether all tags are required for an animation to be considered, if false then only a single tags is required
				ExcludeTags [Name Set]
					Tags that invalidate animations from being considered, excluding them from results
				Aggressors [PalCharacter Set]
					Which characters must be considered aggressors (Only forces said character into an aggressive role, but will still return aggressive results with no aggressors, use tags to exclude)
				ObjectTarget [Actor]
					Target for "furniture" or "object" target animations (Will only consider animations with this target set as compatible)
				Returns : AnimEvents [ACake_AnimEventObj Array]
					Possible AnimEvents found that are compatible with the given parameters

		SCake_GetAllCharStatus
			Returns all Char Status components which are currently enabled, Useful if you would like to get all tracked characters from before binding to get tracked characters or you need to scan through all statuses to find certain traits/stats (Can be performance intensive if used frequently, if you need all char status' frequently then use this function once after assigning SCake_ED_CharTrackEnabled to get any new ones, and use SCake_ED_CharTrackDisabled to purge inactive ones)
				Returns : AllCharStatus [SCake_CharStatus Array]
					All currently enabled CharStatus components

		SCake_GetAnimEventByID
			Gets an AnimEvent by its UniqueID, could use to check if an event is registered or grab a specific event to playback
				UniqueID [Name]
					The UniqueID of the AnimEvent you'd like to get
				Returns : Valid [Boolean]
					Whether the AnimEvent was found or not
				Returns : AnimEvent [ACake_AnimEventObj]
					The AnimEvent object with the associated UniqueID

		SCake_GetAnimSlotByID
			Gets an AnimSlot by its UniqueID, could use to check if an event is registered or grab specific parameters
				UniqueID [Name]
					The UniqueID of the AnimSlot you'd like to get
				Returns : Valid [Boolean]
					Whether the AnimSlot was found or not
				Returns : AnimSlot [ACake_AnimSlotObj]
					The AnimSlot object with the associated UniqueID

		SCake_GetCharStatus
			Returns the status component associated with a Character (CharStatus stores the currently tracked stats for the given character, note that CharStatus components are volitile and can invalidate! They will delete when no-longer needed so always check if they are valid before trying to pull data or else you may cause a crash!)
				CharReference [PalCharacter]
					Character you want the associated CharStatus component for
				Returns : Valid [Boolean]
					Whether CharStatus was found and valid
				Returns : CharStatus [SCake_CharStatus]
					The associated CharStatus component you can pull data from

		SCake_StartAnimEvent
			Starts an animation using Sugar Cake with potentially more information, allowing better control (SugarCake can start both Non- and IsErotic animations with fallback support)
				CharList [PalCharacter Array]
					List of characters to include in the animation (Internally this can be any PalCharacter Reference)
				AnimEvent [ACake_AnimEventObj]
					[Optional] Animation Event to play, if none is supplied a random compatible animation will be selected to play
				TargetDuration [Float]
					[Optional] Forced max duration which applies to looping animations, when at 0.0 or below this will be ignored. (Use to create very specific animations for scenes or interactions)
				IsErotic [Boolean]
					Whether this animation should be erotic or not (Will only play the requested type)
				IsInteraction [Boolean]
					Uses the Interact Player instead of the Loop Player, does not progress without input from external scripts.
				IncludedTags [Name Set]
					[Optional] Tags to search for when finding animations to play (Only applies if no AnimEvent is provided)
				RequireAllTags [Boolean]
					[Optional] Whether all tags are required for an animation to be considered, if false then only a single tags is required
				ExcludeTags [Name Set]
					[Optional] Tags that invalidate animations from being considered, excluding them from results
				Aggressors [PalCharacter Reference]
					[Optional] Which characters should be considered aggressors
				ObjectTarget [Actor]
					[Optional] Target for "furniture" or "object" target animations (Will only play animations with the given object target set as compatible)
				AnimRoot [Transform]
					[Optional] Location where the animation should play (Can use a character's mesh world transform if desired)
				Returns : Valid [Boolean]
					Returns if the animation had valid input and began playing
				Returns : ErrorOutput [String]
					Returns an output message with any errors
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]
					If Valid is true, the AnimEventComp the animation started

		SCake_StartAnimEvent_Basic
			Starts an animation using Sugar Cake with minimal information (SugarCake can start both Non- and IsErotic animations with fallback support)
				CharList [PalCharacter Array]
					List of characters to include in the animation (Internally this can be any PalCharacter Reference)
				AnimEvent [ACake_AnimEventObj]
					[Optional] Animation Event to play, if none is supplied a random compatible animation will be selected to play
				IsErotic [Boolean]
					Whether this animation should be erotic or not (Will only play the requested type)
				IsInteraction [Boolean]
					Uses the Interact Player instead of the Loop Player, does not progress without input from external scripts.
				ObjectTarget [Actor]
					[Optional] Target for "furniture" or "object" target animations (Will only play animations with the given object target set as compatible)
				Returns : Valid [Boolean]
					Returns if the animation had valid input and began playing
				Returns : ErrorOutput [String]
					Returns an output message with any errors
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]
					If Valid is true, the AnimEventComp the animation started

	Dispatchers

		ACake_ED_AnimEnd
			Called whenever an Animation Event ends and returns a refernece to it (Should grab data immediately, the event reference will self-delete a short period after an animation ends)
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]

		ACake_ED_AnimEventSwitch
			Called whenever an Animation Event switches to a new Animation Event for playback (such as the player entering the anim control menu and switching which animation event to play, does not trigger when Event starts, only when switching during playback)
				returns : AnimEventPlayer [ACake_AnimEventPlayer]
					The Event reference which switched the playing AnimEvent

		ACake_ED_AnimStart
			Called whenever an Animation Event starts and returns a reference to it
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]

		ACake_ED_AnimSwitch
			Called whenever the playing animation/stage changes in an event, whether switched manually or automatically (also triggers when Animation Events switch, however "ACake_ED_AnimEventSwitch" is better for this purpose)
				returns : AnimEventPlayer [ACake_AnimEventPlayer]
					The Event reference which switched the playing animation/stage

		SCake_ED_CharAroused
			Called when a character has become aroused
				Returns : CharReference [PalCharacter]
					The character which has become aroused

		SCake_ED_CharClimax
			Called when a character climaxes
				Returns : CharReference [PalCharacter]
					The character which climaxed

		SCake_ED_CharTrackEnabled
			Called when a character becomes enabled in the tracker
				Returns : CharReference [PalCharacter]
					Character that is now being tracked
				Returns : CharStatus [SCake_CharStatus]
					Character Status object which is now updating

		SCake_ED_CharTrackDisabled
			Called when a character becomes disabled in the tracker
				Returns : CharReference [PalCharacter]
					Character that is no longer being tracked
				Returns : CharStatus [SCake_CharStatus]
					Character Status object which is no longer updating

		SCake_ED_EventClimax
			Called whenever an Animation Event triggers climax
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]
					Reference to the specific event
				Returns : CharsClimaxed [PalCharacter Set]
					Characters who orgasmed in the event

		SCake_ED_SEquipChanged
			called when any character with an associated PalComp has their SEquip tags changed. (Note: This also triggers when a PalComp is first created, however SCake_ED_TrackPalEnabled is much better to use for that use case)
				Returns : CharReference [PalCharacter]
					Character which had their tags changed

SCake_CharStatus
	The tracking component which tracks SCake stats and triggers for a specific character

	Variables

		InstanceID [GUID]
			The internal ID used by the base game to track the character

		PalCharacter [PalCharacter]
			The current PalCharacter reference for the tracked character (when this becomes invalid the tracker disables itself)
		
		Arousal [Float]
			Character's current Arousal
		
		CloseToClimax [Boolean]
			Whether the character is close to climax
		
		IsAroused [Boolean]
			Whether the character is currently aroused
		
		ModelTags [Name Set]
			Character's current Model Tags
		
		SEquipTags [Name Set]
			Character's current SEquip Tags
		
		SexualPleasure [Float]
			Character's current Sexual Pleasure
		
		SexHeat [Float]
			The character's current Sex Heat

		OrgasmCount [Integer]
			Times this character has orgasmed
		
		SexCount [Integer]
			Times this character has participated in Erotic Animations with other characters
		
		MasturbationCount [Integer]
			Times this character has been solo in Erotic Animations

		IsEnabled [Boolean]
			Whether this tracker is currently enabled (Values only actively update while IsEnabled is true)

	Functions

		AddArousal
			Adds the given amount to the character's arousal, use negative values to reduce arousal (affected by multipliers)
				AmountToAdd [Float]
					The amount of arousal to add
				Returns : NewArousal [Float]
					The new amount of Arousal after the added amount
				Returns : IsAroused [Boolean]
					Whether the character is currently aroused after the added amount

		AddSexualPleasure
			Adds the given amount to the character's Sexual Pleasure, use negative values to reduce Sexual Pleasure
				AmountToAdd [Float]
					The amount of Sexual Pleasure to add
				Returns : NewSexualPleasure [Float]
					The new amount of Sexual Pleasure after the added amount
				Returns : CloseToClimax [Boolean]
					Whether the character is close to a climax after the added amount

		AddSexHeat
			Adds the given amount to the character's SexHeat, use negative values to reduce SexHeat (affected by multipliers)
				AmountToAdd [Float]
					The amount of SexHeat to add
				Returns : NewSexHeat [Float]
					The new amount of SexHeat after the added amount
				Returns : NewArousal [Float]
					The new amount of Arousal after the added amount
				Returns : IsAroused [Boolean]
					Whether the character is Aroused after the added amount

		ArbChangeString
			Change an ArbString value on the character
				NameKey [Name]
					Name Key
				ValueString [String]
					String Value
				ShouldPersist [Boolean]
					Whether SCake should save this ArbString (Be extremely careful when saving ArbStrings as they won't be automatically cleared!)

		AddModelTags
			Adds Model/SEquip Tags to the character's existing tags
				AddTags [Name Array]
					Tags that should be added to existing tags
				IsSEquip [Boolean]
					Whether these tags are SEquip Tags

		GetArbString [Pure]
			Returns the requested ArbString and whether it is set to persist
				Key [Name]
					Key to search for
				Returns: Value [String]
					The returned String Value (blank if nothing found)
				Returns: ShouldPersist [Boolean]
					Whether the ArbString is set to persist or not

		RemoveModelTags
			Removes Model/SEquip Tags from the character's existing tags
				RemoveTags [Name Array]
					Tags that should be removed from the existing tags
				IsSEquip [Boolean]
					Whether these tags are SEquip Tags

		ResetModelTags
			Resets the Model and SEquip Tags to whatever SCake determines default should be
				SEquip [Boolean]
					Whether to reset the SEquip Tags (When true does not reset Model Tags)

		SetModelTags
			Sets the Model/SEquip Tags for the character, overwriting the previous tags
				NewTags [Name Array]
					Tags that should replace the existing tags
				IsSEquip [Boolean]
					Whether these tags are SEquip Tags

	Dispatchers

		CharStatus_ED_Climax
			Called when the character climaxes
				Returns : CharReference [PalCharacter]
					The character which climaxed
				Returns : CharStatus [SCake_CharStatus]
					The associated CharStatus object for the climaxed character

		CharStatus_ED_Aroused
			Called when the character becomes Aroused (Reaches the set threshold of arousal)
				Returns : CharReference [PalCharacter]
					The character which is now aroused
				Returns : CharStatus [SCake_CharStatus]
					The associated CharStatus object for the aroused character

SCake_AnimEventPlayer

	Variables

		AnimationRoot [Transform]
			The Animation's Root location

		Aggressors [PalCharacter Set]
			Characters in the animation currently set as the Aggressors

		CharList [PalCharacter Array]
			Characters participating in the animation, ordered by Slot Order

		CharsHaveClimaxed [PalCharacter Set]
			Which characters in the animation have climaxed so far
		
		ForceDuration [Float]
			Any override duration set on the animation (0.0 if no forced duration)
		
		PlaybackActive [Boolean]
			Whether the animaiton is currently playing (Becomes inactive if the AnimEvent is ended)

		PlayingAnimEvent [SCake_AnimEventObj]
			The currently playing AnimEvent
		
		StagePlaybackDuration [Float]
			How long, in seconds, the current stage has been playing for
		
		TotalPlaybackDuration [Float]
			How long, in seconds, the AnimEvent has been playing for

	Functions
		
		EndInteract
			Moves the current animation to the end state, (intended to end interact animations but can be used on non-interact animations too)

		SwitchAnimEvent
			Attempts to switch the currently playing AnimEvent to the provided one
				AnimEvent [SCake_AnimEventObj]
					AnimEvent to switch to
				Returns : Valid [Boolean]
					Whether the AnimEvent successfully switched
				Returns : ErrorOutput [String]
					If Valid is false, returns an error string

	Dispatchers

		AnimEventPlayer_ED_AnimEnd
			Called whenever this Animation Event ends and returns a refernece to it (Should grab data immediately, the event reference will self-delete a short period after an animation ends)
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]
		
		AnimEventPlayer_ED_EventClimax
			Called whenever this Animation Event triggers climax
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]
					Reference to the specific event
				Returns : CharsClimaxed [PalCharacter Set]
					Characters who orgasmed in the event
		
		AnimEventPlayer_ED_AnimEventSwitch
			Called whenever this Animation Event switches to a new Animation Event for playback (such as the player entering the anim control menu and switching which animation event to play, does not trigger when Event starts, only when switching during playback)
				returns : AnimEventPlayer [ACake_AnimEventPlayer]
					The Event reference which switched the playing AnimEvent

		AnimEventPlayer_ED_AnimStart
			Called whenever this Animation Event starts and returns a reference to it
				Returns : AnimEventPlayer [ACake_AnimEventPlayer]

		AnimEventPlayer_ED_AnimSwitch
			Called whenever the playing animation/stage changes in this event, whether switched manually or automatically (also triggers when Animation Events switch, however "ACake_ED_AnimEventSwitch" is better for this purpose)
				returns : AnimEventPlayer [ACake_AnimEventPlayer]
					The Event reference which switched the playing animation/stage

	ACake_AnimEventObj

		Variables

			ActorCount [Integer]
				How many characters are intended to participate in this AnimEvent
			
			Aggressors [PalCharacter Set]
				What ActorSlots are considered aggressors for this AnimEvent
			
			ArbString [Name|String Map]
				ArbString data added to the AnimEvent
			
			Author [String]
				Author set on the AnimEvent

			IsEnabled [Boolean]
				Whether this AnimEvent is set as enabled or not
			
			IsErotic [Boolean]
				Whether this animation is tagged as Erotic or not
			
			IsInteraction [Boolean]
				Whether this animation is tagged for interaction playback

			Name [String]
				Name given to the AnimEvent

			PackName [String]
				Pack this AnimEvent came from

			SourceFile [String]
				JSON file this AnimEvent came from (useful for debugging)

			UniqueID [Name]
				UniqueID given to this AnimEvent

		Functions
			
			GetAllTags [Pure]
				Returns all tags present in the AnimEvent (including all from the AnimSlots)

	ACake_AnimSlotObj

		Variables

			Author [String]
				Author set for this animation
			
			ArbString [Name|String Map]
				ArbString data added to the AnimSlot
			
			IsClimax [Boolean]
				Whether this animation is entended to be used as a Climax animation
			
			IsErotic [Boolean]
				Whether this animation is tagged as Erotic

			IsLooping [Boolean]
				Whether this animation should loop or not
			
			Name [String]
				Name given to this AnimSlot

			PackName [String]
				Pack this AnimSlot came from
			
			SourceFile [String]
				JSON file this AnimSlot came from (useful for debugging)
			
			SpeedDefault [Float]
				Default playback speed of the animation
			
			StartTime [Float]
				Start time into the animationt playback should start

			Tags [Name Set]
				Tags set for this AnimSlot (Addative when put into an AnimEvent)

			UniqueID [Name]
				UniqueID given to this AnimSlot